#coding=utf-8
'''
    家对象定义
'''
import logging, traceback
from tornado.escape import json_encode, json_decode
import util
import const
from mysqlHelper import mysql
import copy
import user
Config_task=[
    {
        'type':'first',
        'name':'新手任务',
        'sort':1,
        'task':[
            {
                'type':'first_add_friend',
                'name':'添加第一位好友',
                'desc':'在酒吧和一位异性约会，并添加对方为好友',
                'now':0,
                'total':1,
                'award':{
                        'gold':100,
                        'exp':20,
                        'goods':[1093]
                        },
                'chance':1,
                'targetUser':[],
                'sort':1,#排序                
                'needTask':[]#需要完成的任务
            },
            {
                'type':'first_drink_wine',
                'name':'第一次喝酒',
                'desc':'点击背包把刚奖励回来的酒喝掉',
                'now':0,
                'total':1,
                'award':{
                        'gold':100,
                        'exp':20,
                        'goods':[]
                        },
                'chance':1,
                'targetUser':[],
                'sort':2,#排序                
                'needTask':[{'type1':'first','type2':'first_add_friend'}]#需要完成的任务
            },
            {
                'type':'first_steal_gold',
                'name':'第一次借钱',
                'desc':'打开好友列表，点击房子图标进入好友公寓后点击地上的存钱罐进行借钱',
                'now':0,
                'total':1,
                'award':{
                        'gold':100,
                        'exp':20,
                        'goods':[]
                        },
                'chance':1,
                'targetUser':[],
                'sort':3,#排序                
                'needTask':[{'type1':'first','type2':'first_drink_wine'}]#需要完成的任务
            }
#            ,
#            {
#                'type':'first_game_pk',
#                'name':'第一次PK同性',
#                'desc':'进入魅力PK，PK一个同性',
#                'now':0,
#                'total':1,
#                'award':{
#                        'gold':100,
#                        'exp':20,
#                        'goods':[]
#                        },
#                'chance':1,
#                'targetUser':[],
#                'sort':4,#排序                
#                'needTask':[{'type1':'first','type2':'first_steal_gold'}]#需要完成的任务
#            }
        ]
    },
    
    {
        'type':'main_task',
        'name':'主线任务',
        'sort':2,
        'task':
        [
            {    
                'type':'add_friend',#添加好友        
                'name':'添加好友',
                'desc':'进入酒吧，和2位陌生异性搭讪、约会，并将TA们添加为好友',
                'now':0,
                'total':2,
                'award':{
                        'gold':100,
                        'exp':10,
                        'goods':[1092]#龙舌兰
                        },
                'chance':0.5,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':1,#排序
                'needTask':[]#需要完成的任务
            },
            
            {            
                'type':'invite_friend',#邀请好友
                'name':'邀请好友',
                'desc':'邀请一位微博好友注册游戏，让你的亲友团势力更加强大',
                'now':0,
                'total':1,
                'award':{
                        'gold':500,
                        'exp':10,
                        'goods':[]
                        },
                'chance':0.5,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':2,#排序
                'needTask':[]#需要完成的任务
            }
        ]
        
    },
    
    {
        'type':'day_task',
        'name':'日常任务',
        'sort':3,
        'task':
        [
        
            {    
                'type':'encounter',#异性邂逅        
                'name':'异性邂逅',
                'desc':'进入酒吧，和5位不同的异性搭讪、约会，就可以获得任务奖励哦',
                'now':0,
                'total':5,
                'award':{
                        'gold':100,
                        'exp':20,
                        'goods':[1091]#朗姆酒
                        },
                'chance':1,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':1,#排序
                'needTask':[]#需要完成的任务
            },
            
            {    
                'type':'encounter_refill',#成功续杯        
                'name':'成功续杯',
                'desc':'进入酒吧，和2位异性搭讪、约会，并成功续杯',
                'now':0,
                'total':2,
                'award':{
                        'gold':100,
                        'exp':50,
                        'goods':[1098]#苹果
                        },
                'chance':1,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':2,#排序
                'needTask':[]#需要完成的任务
            },
            
            {            
                'type':'encounter_friend',#好友约会
                'name':'好友约会',
                'desc':'和1位好友约会，并进入到续杯阶段，和TA谈谈情、说说爱',
                'now':0,
                'total':1,
                'award':{
                        'gold':50,
                        'exp':10,
                        'goods':[1093]#马爹利
                        },
                'chance':1,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':3,#排序               
                'needTask':[]#需要完成的任务
            },
            
            {        
                'type':'pk_success',#勇敢插足    
                'name':'勇敢插足',
                'desc':'进入酒吧插足区，鼓起勇气，插足2个约会并获得成功',
                'now':0,
                'total':2,
                'award':{
                        'gold':100,
                        'exp':20,
                        'goods':[1101]#香蕉
                        },
                'chance':1,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':4,#排序
                'needTask':[]#需要完成的任务
            },
            
            {    
                'type':'magic_same_sex',#魔法达人        
                'name':'魔法达人',
                'desc':'进入酒吧插足区，插足1个约会，并对约会中的同性使用变形魔法',
                'now':0,
                'total':1,
                'award':{
                        'gold':750,
                        'exp':10,
                        'goods':[1094]#草莓
                        },
                'chance':1,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':5,#排序
                'needTask':[]#需要完成的任务
            },
            
            {            
                'type':'steal_gold',#借点钱花花
                'name':'借点钱花花',
                'desc':'拜访10位好友的房间，点击TA的小猪，借点儿零花钱来花花',
                'now':0,
                'total':10,
                'award':{
                        'gold':0,
                        'exp':10,
                        'goods':[1091]
                        },
                'chance':1,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':6,#排序
                'needTask':[]#需要完成的任务
            },
            
            {        
                'type':'clean_house',#热心肠    
                'name':'热心肠',
                'desc':'为10个好友打扫房间，让TA们的房间变得更干净哦',
                'now':0,
                'total':10,
                'award':{
                        'gold':100,
                        'exp':0,
                        'goods':[1098]
                        },
                'chance':1,#获得机会
                'targetUser':[], #任务需要累计对方的uid
                'sort':7,#排序
                'needTask':[]#需要完成的任务
            },
        ]
    }
    
]


class taskManager(util.SingleClass):
    
    def __init__(self):
        pass
    
    @staticmethod    
    def do_task(tmpUser,type1,type2,targetUid=None):
        '''
            执行任务，type1为一级类名称，type2为2级类名称 targetUid为关联的用户id 
            do_task(tmpUser,'main_task','add_friend',123456)        
        '''
        tmpMyTask = tmpUser.m_task
        uid = tmpUser.getUID() 
        
                       
        for v in tmpMyTask:        
            for vv in v['task']:
                
                if v['type']==type1 and vv['type']==type2:
                    
                    if not taskManager.did_need_task(tmpMyTask,vv.get('needTask')):
                        return False                    
                    tmpBefNow = vv['now']
                    vv['now']=vv['now']+1
                    if targetUid!=None:
                        if targetUid not in vv['targetUser']:
                            vv['targetUser'].append(targetUid)
                        vv['now'] = len(vv['targetUser'])
                    tmpNoticeDict = {
                                    'task':{'type1':type1,'type2':type2,'now':vv['now'],'total':vv['total']}
                                    } 
                    
                    if tmpBefNow != vv['now'] :
                        #发一条系统消息通知对方
                        tmpSendType = 'do_task'
                        tmpContent = ''                       
                        tmpContentAddtion = tmpNoticeDict        
                        user.UserManager.pushSysInfoToSomebody(tmpSendType, tmpContent, tmpContentAddtion, *tuple([uid]))    
                        if not v['task']:
                            tmpMyTask.remove(v)
                        taskManager.save_task_to_db(tmpUser)
                        return True
                    return False
        return False        
    
    @staticmethod
    def did_need_task(tmpMyTask,needTask): 
        '''查询此任务是否已经做了，如果在我的任务列表里找不到这个任务，表示已经做了'''      
        if needTask:
            for k in tmpMyTask:
                for kk in k['task']:
                    for kkk in needTask:
                        if k['type']==kkk['type1'] and kk['type']==kkk['type2']:
                            return False
        return True
                
    @staticmethod
    def do_leave_task(uid,type1,type2,targetUid=None):
        '''执行离线任务'''
        sql = "SELECT task FROM t_user_record WHERE uid = %d"%uid
        conn = mysql()
        row = conn.getRow(sql)
        tmpMyTask = row.get('task')
        if not tmpMyTask:
            return
        tmpMyTask = json_decode(tmpMyTask)
        if not tmpMyTask:
            return
        
        for v in tmpMyTask:        
            for vv in v['task']:
                if v['type']==type1 and vv['type']==type2:
                    vv['now']=vv['now']+1
                    if targetUid!=None:
                        if targetUid not in vv['targetUser']:
                            vv['targetUser'].append(targetUid)
                            vv['now'] = len(vv['targetUser'])                                
                    break
        conn.upData('t_user_record', {'task':json_encode(tmpMyTask)}, "WHERE uid = %d"%uid, asyn=True)
    
    @staticmethod
    def save_task_to_db(tmpUser):
        if not tmpUser:
            return        
        tmpMyTask = tmpUser.m_task
        uid = tmpUser.getUID()
        conn = mysql() 
        conn.upData('t_user_record', {'task':json_encode(tmpMyTask)}, "WHERE uid = %d"%uid, asyn=True)        
        
        
    @staticmethod
    def rand_task(task):
        '''任务随机生成函数'''    
        tmpTask = copy.deepcopy(task)    
        for v in tmpTask:        
            for vv in v['task']:
                tmpChance = vv['chance']*100            
                if util.rander(tmpChance)==False:
                    v['task'].remove(vv)        
                        
        return tmpTask
    
    @staticmethod
    def userHaveTheTask(findTask1,findTask2,tmpMyTask):
        '''查看用户是否有这个任务  没有则为用户添加此任务，findtask为需要找的任务，userTask为用户的任务'''
        findType1 = findTask1['type']
        findType2 = findTask2['type']
        i=0
        j=0
        for v in tmpMyTask:
            if v['type']==findType1: 
                for kkkk,vvvv in findTask1.iteritems():                    
                    v[kkkk]=vvvv
                               
                for vv in v['task']:
                    if vv['type']== findType2:                        
                        for kkk,vvv in findTask2.iteritems():
                            if kkk=='now':
                                continue
                            else:
                                vv[kkk]=vvv        
                        return    
                j=1
                break
            i+=1
        
        if j==1:
            tmpChance = findTask2['chance']*100            
            if util.rander(tmpChance)==True:
                tmpMyTask[i]['task'].append(findTask2)
            
        else:
            tmpMyTask.append(taskManager.rand_task([findTask1])[0])
        
        return
    
    @staticmethod
    def isUserUnEffectTask(mytype1,mytype2):
        '''判断用户的任务是否有效'''
        tmpTask = copy.deepcopy(Config_task)
        tmpHaveTheTask=0#先定义无效，如果在系统任务中查到此任务，则设置为有效
        for v in tmpTask:
            if v.get('type')==mytype1:
                if v.get('task'):
                    for vv in v.get('task'):
                        if vv.get('type')== mytype2:
                            tmpHaveTheTask=1
        
        if tmpHaveTheTask:
            return True
        else:
            return False
    